﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OWLServer.owl.tipos;
using System.Xml.Serialization;

namespace OWLServerQL.xml
{
    /// <summary>
    /// Representa un individuo en el XML del resultado de la consulta
    /// </summary>
    [XmlRootAttribute("individuo", Namespace = "", IsNullable = false)]
    public class Individuo
    {
        [XmlAttribute]
        public string id;
        [XmlAttribute]
        public string estacioNombres;
        [XmlArrayItem("tipo", typeof(string)), XmlArray("tipos")]
        public List<string> tipos;
        [XmlArrayItem("propiedadDatos", typeof(Propiedad)), XmlArray("propiedadesDatos")]
        public List<Propiedad> propiedadesDatos;
        [XmlArrayItem("propiedadObjetos", typeof(Propiedad)), XmlArray("propiedadesObjetos")]
        public List<Propiedad> propiedadesObjetos;
        [XmlArrayItem("igual", typeof(string)), XmlArray("iguales")]
        public List<string> iguales;
        [XmlArrayItem("diferente", typeof(string)), XmlArray("diferentes")]
        public List<string> diferentes;

        public Individuo() { }

        public Individuo (OWLServer.owl.tipos.Individuo individuo) 
        {
            id = individuo.Id;
            estacioNombres = individuo.EspacioNombres.Uri;
            tipos = elementoToString(individuo.Tipos);
            propiedadesDatos = elementoToString(individuo.PropiedadesDatos);
            propiedadesObjetos = elementoToString(individuo.PropiedadesObjetos);
            iguales = elementoToString(individuo.Iguales);
            diferentes = elementoToString(individuo.Diferentes);
        }

        /// <summary>
        /// Compone la lista de propiedades de Objeto del XML que tiene el individuo
        /// </summary>
        /// <param name="iList">Lista de propiedades de objeto del individuo</param>
        /// <returns>Lista de propiedades de Objeto del XML que tiene el individuo</returns>
        private List<Propiedad> elementoToString(IList<PropiedadObjetoIndividuo> iList)
        {
            List<Propiedad> lista = new List<Propiedad>();

            if (iList != null)
            {
                foreach (PropiedadObjetoIndividuo elemento in iList)
                {
                    lista.Add(new Propiedad(elemento.PropiedadObjeto.Id, elemento.Individuo.Id, elemento.Negada));
                }
            }

            return lista;
        }

        /// <summary>
        /// Compone la lista de elementos del XML que tiene el individuo
        /// </summary>
        /// <param name="iList">Lista de elementos del individuo</param>
        /// <returns>Lista de elementos del XML que tiene el individuo</returns>
        private List<string> elementoToString(IList<OWLServer.owl.tipos.Individuo> iList)
        {
            List<string> lista = new List<string>();

            if (iList != null)
            {
                foreach (OWLServer.owl.tipos.Individuo elemento in iList)
                {
                    lista.Add(elemento.Id);
                }
            }

            return lista;
        }

        /// <summary>
        /// Compone la lista de propiedades de dato del XML que tiene el individuo
        /// </summary>
        /// <param name="iList">Lista de propiedades de dato del individuo</param>
        /// <returns>Lista de propiedades de dato del XML que tiene el individuo</returns>
        private List<Propiedad> elementoToString(IList<PropiedadDatoIndividuo> iList)
        {
            List<Propiedad> lista = new List<Propiedad>();

            if (iList != null)
            {
                foreach (PropiedadDatoIndividuo elemento in iList)
                {
                    lista.Add(new Propiedad(elemento.PropiedadDato.Id, elemento.Valor, elemento.Negada));
                }
            }

            return lista;
        }

        /// <summary>
        /// Compone la lista de tipos del XML que tiene el individuo
        /// </summary>
        /// <param name="iList">Lista de tipos del individuo</param>
        /// <returns>Lista de tipos del XML que tiene el individuo</returns>
        private List<string> elementoToString(IList<Clase> iList)
        {
            List<string> lista = new List<string>();

            if (iList != null)
            {
                foreach (Clase elemento in iList)
                {
                    lista.Add(elemento.Id);
                }
            }

            return lista;
        }
    }
}
